<?php
Linux操作系统基础
一：程序代码：源码（source code）
        编译型语言：编译->汇编
        解释型语言：解释器

        源代码：文本格式
        目标代码：二进制格式        
二：操作系统：
        1，批处理系统：单任务（task）

        2，Bell+MIT+GE = Multics（多路信息计算系统）

        3，Linux：操作系统；
            GNU：GNU/Linux 
            
        4，开源协定：
            GPL，GPLv2, GPLv3, LGPL
            BSD
            Apache software foundation (ASF)
            MIT
        5，
            CPU：timeslice，时间片，
            memory：内存，page frame（4k），
            Disk：filesystem blocks
            Network Card（网卡）：packet（包）
三：完整的OS
        1，kernel + application 
            狭义的OS： 仅指kernel；
            
        2， kernel的功能：
                驱动程序
                内存管理
                进程管理
                安全
                网络功能
                文件系统
            
           3， system call （系统调用）：
            library call: glibc, gnu c library
                API：application programing Interface（应用编程接口）
                ABI: application binary interface（应用二进制接口 ）
            
            4，POSIX（可移植性操作系统接口;）：
                POS：Portable OS
                    Windows Server 2008
                    Linux

            Linux: kernel：www.kernel.org
四：获取发行版
        http://mirrors.aliyun.com 
        http://mirrors.163.com 
        http://mirrors.sohu.com 

 五：shell
        GUI：图形用户界面
            KDE，GNOME，XFCE
        CLI：命令行接口
            bash, zsh, fish
            sh, csh, tcsh, ksh
        
        程序：算法+数据结构
        
        文件系统：
            倒置树状结构：
                windows: 多根
                    \
                Linux: 单根
                    /: 根，路径分隔符；         
            
        Linux的重要哲学思想之一：一切皆文件
            
六：terminal（终端）
            物理终端：physical terminal, /dev/console
            虚拟终端：/dev/tty#  , [1,6]：代表1到6
            图形终端：/dev/tty7, 
            串行终端：/dev/ttyS#
            伪终端：/dev/pts/#
                远程登录的终端；
                图形界面下打开的命令行接口；
                
        命令提示符：prompt
            每个用户都有其默认shell设定；
                查看当前shell各类：echo  $SHELL
                
                [root@localhost ~]# 
                    root: 当前登录的用户名；
                    localhost: 当前主机的hostname；非完整格式；完整格式一般为FQDN；
                    ~：用户当前所在的目录，当前目录，工作目录；
                        非完整格式路径：路径的基名；
                    #：命令提示符：
                        #：管理员的命令提示符；能执行所有操作；
                        $：普通用户，非root用户；不具有管理权限，不能执行管理类操作；
                        
                    注意：不要以管理员用户直接登录；
                        实时管理操作：sudo, su
                        
七：ssh协议：secure shell；
            (1) 查看启用与否：
                ~]# ss  -tnl
                    查看是否监听了22号的tcp端口；
                
            (2) 查看地址：
                ~]$ ip addr list
                    inet
                ~]$ ifconfig
                
            (3) 确保防火墙处于关闭状态
                ~]# iptables  -L -n
                
                CentOS 7：
                    ~]# systemctl  disable  firewalld.service
                    ~]# systemctl  stop  firewalld.service
                    
                CentOS 6:
                    ~]# service  iptables  stop
                    ~]# chkconfig  iptables  off
                
                xshell:> ssh  USERNAME@IP
                
八：Linux的哲学思想：
        1、一切皆文件：
            把几乎所有资源都抽象为文件形式：硬件、通信接口等等 ；
                open(), read(), write(), close(), ...
                
        2、由众多功能单一的程序组成：
            功能单一：一个只做一件事，并且做好；
            复杂任务：组合小程序；
            
        3、尽量避免与用户交互：易于以编程的方式实现自动化任务；
        
        4、使用纯文本文件保持程序的配置信息；
        
九：Linux文件系统：
        目录：路径映射；
        文件：磁盘上的一段存储空间中存储的数据；基于文件名引用文件；按名存取；
        
        文件系统：层级结构
            文件：
                元数据：属性信息， inode
                数据：文件内容, 磁盘空间
                
            /：原初超点
                
            文件的路径表示：
                绝对路径：从根开始的路径；
                相对路径：从当前目录开始表示出的路径；
                    当前目录：.
                    当前目录的上级目录： ..
                    
                文件命名法则：
                    严格区分字符大小写：file1, File1, FILE1
                    目录也是文件，在同一个路径下，两个文件不能同名
                    支持使用除/以外的所有字符；但不建议使用特殊字符命名文件；
                    最长不能超过255个字符；
                    
                家目录：home, $HOME
                    用户的起始目录；普通用户创建文件的位置；
                    ~：用户的家目录；
                    
                工作目录：working directory, current directory; 
                    路径分为：
                        路径名： dirname  /PATH/TO/SOMEFILE
                            结果： /PATH/TO
                        基名: basename  /PATH/TO/SOMEFILE
                            结果： SOMEFILE

十：命令的通用语法格式：
        $ COMMAND  OPTIONS  ARGUMENTS
        
        COMMAND：
            可执行文件：
                二进制格式程序文件；
                脚本程序文件：需要由解释器解释运行；
                
                运行一个命令：基于一个程序文件创建出进程；
                    进程：运行中的程序，有生命周期；
                    
                命令本身是一个可执行的程序文件：二进制格式，有可能会调用库文件；
                    多数程序文件都存放在：/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
                        bin: binary, 普通命令；
                        sbin: 管理命令；
                        库：（.so：shared object）
                            /lib, /lib64
                            /usr/lib, /usr/lib64
                            
                    可执行程序的格式：
                        windows: exe, msi, dll
                        Linux：ELF, so
                        
                    命令分为两类：
                        由shell程序自带的命令：内建命令，内置命令，builtin
                        独立的可执行程序文件：外部命令，文件名即命令名；
                        
                        判断命令的种类：type  COMMAND
                        
                    shell程序是独特的程序：查找并解析命令，向内核提交命令运行为进程，解析路径，提供自动化运行命令的环境，等等 ；
                        命令解释器：词法分析、语法分析；
                        
                        $PATH环境变量：保存了查找外部命令对应的程序文件的起始路径；彼此间使用冒号分隔；
                            查找方式：自左而右
                            
                            查找结果会缓存：hash表中；
                                管理命令：hash
                                
        选项：调整命令的运行特性; 
            分别标识了运行程序中的哪些代码；
            
            有两种形式：
                短选项: -CHAR, 例如， -l, -h, -d
                长选项: --WORD, 例如， --long, --human-readable
                
                注意：
                    多数情况下，多个短选项可合并：-l  -h = -lh
                    有些选项可以带参数，称为选项的参数；
                    
        命令参数：
            命令的作用对象，命令对什么生效；
            
            注意：有的命令可有多个参数，参数间使用空白字符分隔；


十一：获取命令的使用帮助：

        查看是内部命令还是外部命令：type COMMAND

        内建命令：
            # help  COMMAND
            
        外部命令：
            (1) 命令自带的简要格式的使用帮助；
                # COMMAND  --help
            (2) 使用手册（manual）
                存储位置：/usr/share/man/
                    章节：man1, man2, ..., man8
                    格式：压缩，节约空间；
                    
                $ man  KEYWORD
                
                    SECTION：
                        NAME： 名称及简要功能描述；
                        SYNOPSIS：命令使用格式摘要；
                        DESCRIPTION：详细描述信息；
                        OPTIONS：选项详细说明；
                        AUTHOR：作者
                        BUGS：报告程序bug的途径；
                        EXAMPLES：使用示例；
                        SEE ALSO：额外参考
                        FILES：相关的配置文件；
                        
                    SYNOPSIS:
                        []：可选内容；
                        <>：必须提供的内容；
                        a|b|c：多选一；
                        ...：同类内容可出现多次；
                        
                章节：
                    1   Executable programs or shell commands
                    2   System calls (functions provided by the kernel)
                    3   Library calls (functions within program libraries)
                    4   Special files (usually found in /dev)
                    5   File formats and conventions eg /etc/passwd
                    6   Games
                    7   Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
                    8   System administration commands (usually only for root)
                    9   Kernel routines [Non standard]
                    
                    $ man  CHAPTER  KEYWORD 
                        
                    查看某关键字在哪些章节下有手册：
                        $ whatis  KEYWORD
                        $ man  -f  KEYWORD
                        
                        注意：其执行过程是查询数据库进行的；手动更新数据库：
                            $ makewhatis
                            
                    选项：
                        -k
                        -K
                        
                        基于关键字搜索相关的使用手册；
                        
                注意：man命令先是通过压缩工具解压帮助手册为某临时文件，而后显示帮助手册的内容是通过调用less命令实现：
                    $ man  less：获取使用帮助
                    
                    翻屏：
                        Space, f：向文件尾部翻一屏；
                        b：向文件首部翻一屏；
                        d：向文件尾部翻半屏；
                        u：向文件首部翻半屏；
                        Enter：向文件尾部翻一行；
                        y, k：向文件首部翻一行；
                        
                        G：跳转至最后一行；
                        #G：跳转至第#行；
                        
                    关键字搜索：
                        /KEYWORD：向文件尾部搜索；
                        ?KEYWORD：向文件首部搜索；
                        
                            n：与查找命令方向相同；
                            N：与查找命令方向相反；
                        
                    退出：
                        q：quit
                        
                注意：man命令会到很多路径下查找使用手册；这些路径是在/etc/man_db.conf(CentOS7)文件中使用“MANPATH“指令定义的路径；
                    $ man  -M /PATH/TO/SOMEDIR  KEYWORD 
                        到指定路径下查找相关的KEYWORD的手册并显示之；
                        
                练习：
                    (a) 获取shutdown命令的用法；
                    (b) 添加一个用户slackware，要求添加时指定其uid为2001；
                    
            (3) info COMMAND
                获取命令的在线文档；
                
            (4) 很多应用程序会自带帮助文档：/usr/share/doc/APPLICATION_NAME-VERSION/
                README：程序的相关信息；
                INSTALL：程序的安装帮助；
                CHANGES：版本迭代的更新信息；
                
            (5) 程序的主站上的文档
                Document
                wiki
                FAQ
                
            (6) 发行版主站文档
                RedHat：
                    http://www.redhat.com/docs
                    
            (7) 搜索引擎
                Google
                
                    keyword  filetype:TYPE
                    keyword  site:DOMAIN.TLD



十二：Linux的文件系统：FHS
        Kernel, libraries, application
            kernel: /boot/vmlinuz
            libraries: /lib, /lib64, /usr/lib, /usr/lib64
            application：
                二进制程序
                库文件
                配置文件
                帮助文件
                
        FHS：
            /bin：所有用户可用的基本命令程序文件；
            /sbin：实现管理功能的程序文件；
            /boot：引导加载器的静态文件；内核、ramdisk（initrd, initramfs）文件亦在此处；
            /dev：存储特殊文件或设备文件；
                设备有两种类型：
                    块设备：随机访问，以“块”为单位实现数据交换；"b"
                    字符设备：线性访问，以“字符”为单位实现数据交换；"c"
            /etc：系统和应用程序的配置文件；
            /home：普通用户的家目录；
                /home/USERNAME：每个都有自己专用的家目录；
            /root：管理员的家目录；
            /lib：共享库文件，以内核模块文件；
                modules：内核模块；
            /lib64：64位系统特有的存放64位共享库的路径；
            /media：挂载便携式设备；
            /mnt：挂载临时文件系统；
            /opt：第三方应用程序的安装路径；
            /srv：当前系统提供的服务运行中的用到的中间数据；
            /tmp：临时文件存储位置；
            /usr：/usr Hierarchy，全局共享只读数据；
                bin, sbin
                lib, lib64 
                include：C程序头文件；
                share：平台的独立的共享数据文件；
                local：第三方应用程序安装路径；
                src：程序源代码；
            /usr/local：第三方应用程序安装路径；可使用独立分区；
            /var：可变数据存储位置；
                cache：应用程序缓存数据；
                lib：可变状态信息数据；
                log：日志文件目录；
                lock：锁文件；
                run：进程相关的数据，主要用户存储pid文件；
                
            /proc：基于内存的虚拟文件系统； 用于为内核及进程存储其相关信息； 它们多数为内核参数，例如net.ipv4.ip_forward，虚拟为/proc/sys/net/ipv4/ip_forward；
            /sys：sysfs虚拟文件系统，是一种提供了比/proc更为理想的访问内核数据的另一个途径；其主要作用在于为管理Linux系统上的设备提供一种统一模型的接口；
                        
            文件系统的挂载：把额外的文件系统与当前根文件系统上的某个目录建立关联关系，并以之作为新的文件的访问入口的操作过程，就叫做挂载(mount)；拆除此关联关系的过程，即为卸载(umount)；
            
        Linux系统上文件的类型：
            -：常规文件，有时使用f标识；
            d：目录文件；
            b：block; 
            c: character devices; 
            l：symbolic link files; 符号链接文件； 
            p：pipe，命名管道；
            s：sokcet，套接字文件；